#include "CocosDenshionTest.h"
#include "cocos2d.h"
#include "SimpleAudioEngine.h"

// android effect only support ogg
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	#define EFFECT_FILE		"effect2.ogg"
#elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
	#define EFFECT_FILE		"effect1.raw"
#else
	#define EFFECT_FILE		"effect1.wav"
#endif // CC_PLATFORM_ANDROID

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
	#define MUSIC_FILE		"music.mid"
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)
	#define MUSIC_FILE		"background.ogg"
#else
	#define MUSIC_FILE		"background.mp3"
#endif // CC_PLATFORM_WIN32

using namespace cocos2d;
using namespace CocosDenshion;

#define LINE_SPACE          40

CocosDenshionTest::CocosDenshionTest()
: m_pItmeMenu(NULL),
m_tBeginPos(CCPointZero),
m_nSoundId(0)
{
	std::string testItems[] = {
		"play background music",
		"stop background music",
		"pause background music",
		"resume background music",
		"rewind background music",
		"is background music playing",
		"play effect",
        "play effect repeatly",
		"stop effect",
		"unload effect",
		"add background music volume",
		"sub background music volume",
		"add effects volume",
		"sub effects volume",
		"pause effect",
		"resume effect",
		"pause all effects",
		"resume all effects",
		"stop all effects"
	};

	// add menu items for tests
	m_pItmeMenu = CCMenu::menuWithItems(NULL);
	CCSize s = CCDirector::sharedDirector()->getWinSize();
	m_nTestCount = sizeof(testItems) / sizeof(testItems[0]);

	for (int i = 0; i < m_nTestCount; ++i)
	{
//#if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
//		CCLabelBMFont* label = CCLabelBMFont::labelWithString(testItems[i].c_str(),  "fonts/arial16.fnt");
//#else
        CCLabelTTF* label = CCLabelTTF::labelWithString(testItems[i].c_str(), "Arial", 24);
//#endif		
        CCMenuItemLabel* pMenuItem = CCMenuItemLabel::itemWithLabel(label, this, menu_selector(CocosDenshionTest::menuCallback));
		
		m_pItmeMenu->addChild(pMenuItem, i + 10000);
		pMenuItem->setPosition( CCPointMake( s.width / 2, (s.height - (i + 1) * LINE_SPACE) ));
	}

	m_pItmeMenu->setContentSize(CCSizeMake(s.width, (m_nTestCount + 1) * LINE_SPACE));
	m_pItmeMenu->setPosition(CCPointZero);
	addChild(m_pItmeMenu);

	setIsTouchEnabled(true);

	// preload background music and effect
	SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::fullPathFromRelativePath(MUSIC_FILE) );
	SimpleAudioEngine::sharedEngine()->preloadEffect( CCFileUtils::fullPathFromRelativePath(EFFECT_FILE) );
    
    // set default volume
    SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
    SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
}

CocosDenshionTest::~CocosDenshionTest()
{
}

void CocosDenshionTest::onExit()
{
	CCLayer::onExit();

	SimpleAudioEngine::sharedEngine()->end();
}

void CocosDenshionTest::menuCallback(CCObject * pSender)
{
	// get the userdata, it's the index of the menu item clicked
	CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
	int nIdx = pMenuItem->getZOrder() - 10000;

	switch(nIdx)
	{
	// play background music
	case 0:

		SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::fullPathFromRelativePath(MUSIC_FILE)).c_str(), true);
		break;
	// stop background music
	case 1:
		SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
		break;
	// pause background music
	case 2:
		SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
		break;
	// resume background music
	case 3:
		SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
		break;
	// rewind background music
	case 4:
		SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
		break;
	// is background music playing
	case 5:
		if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())
		{
			CCLOG("background music is playing");
		}
		else
		{
            CCLOG("background music is not playing");
		}
		break;
	// play effect
	case 6:
		m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
		break;
    // play effect
    case 7:
        m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str(), true);
        break;
    // stop effect
	case 8:
		SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);
		break;
	// unload effect
	case 9:
		SimpleAudioEngine::sharedEngine()->unloadEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
		break;
		// add bakcground music volume
	case 10:
		SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
		break;
		// sub backgroud music volume
	case 11:
		SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
		break;
		// add effects volume
	case 12:
		SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
		break;
		// sub effects volume
	case 13:
		SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
		break;
	case 14:
		SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);
		break;
	case 15:
		SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);
		break;
	case 16:
		SimpleAudioEngine::sharedEngine()->pauseAllEffects();
		break;
	case 17:
		SimpleAudioEngine::sharedEngine()->resumeAllEffects();
		break;
	case 18:
		SimpleAudioEngine::sharedEngine()->stopAllEffects();
		break;
	}
	
}

void CocosDenshionTest::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator it = pTouches->begin();
	CCTouch* touch = (CCTouch*)(*it);

	m_tBeginPos = touch->locationInView();	
	m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos );
}

void CocosDenshionTest::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator it = pTouches->begin();
	CCTouch* touch = (CCTouch*)(*it);

	CCPoint touchLocation = touch->locationInView();	
	touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation );
	float nMoveY = touchLocation.y - m_tBeginPos.y;

	CCPoint curPos  = m_pItmeMenu->getPosition();
	CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY);
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	if (nextPos.y < 0.0f)
	{
		m_pItmeMenu->setPosition(CCPointZero);
		return;
	}

	if (nextPos.y > ((m_nTestCount + 1)* LINE_SPACE - winSize.height))
	{
		m_pItmeMenu->setPosition(ccp(0, ((m_nTestCount + 1)* LINE_SPACE - winSize.height)));
		return;
	}

	m_pItmeMenu->setPosition(nextPos);
	m_tBeginPos = touchLocation;
}

void CocosDenshionTestScene::runThisTest()
{
	CCLayer* pLayer = new CocosDenshionTest();
	addChild(pLayer);
	pLayer->autorelease();

	CCDirector::sharedDirector()->replaceScene(this);
}
